Heartbleed能讓攻擊者從伺服器記憶體中讀取 64 KB 的資料,利用傳送 heartbeat 的封包給伺服器,在封包中控制變數導致 memcpy 函數複製錯誤的記憶體資料,因而擷取記憶體中可能存在的機敏資料。記憶體中最嚴重可能包含 ssl private key、session cookie、使用者密碼等,因此可能因為這樣的漏洞導致伺服器遭到入侵或取得使用者帳號。 -- 《devco.re》
https://www.openssl.org/news/secadv_20140407.txt <-- openssl安全通報
"戴夫寇爾執行長翁浩正表示,OpenSSL是一個用C語言撰寫的函式庫,根據Github上面的提交記錄,OpenSSL出問題的那行程式碼是在2011年12月31日22時59分57秒所提交的。
「Heartbeat是一個確認網站服務是否持續運作的服務,」翁浩正進一步解釋,當確認Heartbeat服務執行的封包回傳時,伺服器原本也應該要先確認封包大小以及使用者的權限後,再進行Heartbeat驗證。
不過,他指出,出現Heartbleed漏洞的OpenSSL版本,在執行Heartbeat服務時,因為函式庫沒有事先檢查所需要的回傳資料大小,可能是為了加快SSL溝通的速度,一律都傳回64KB大小的資料,而所回傳的資料,也並沒有驗證使用者是否有權限可以接收。
也就是說,當執行Heartbeat服務時,假設,如果原先只需回傳2KB的資料,但因為沒有事先確認原本所需資料的大小,當OpenSSL函式庫預設回傳64KB的資料,執行Heartbeat服務的伺服器就會把暫存在記憶體中其他62KB的資料,一併回傳。
翁浩正說:「這是一個撰寫C語言時,不應該出現的基本程式設計錯誤。」這種確認欄位資料的檢查,其實是所有程式撰寫時的基本功夫,不論是有心或是無意導致這樣的漏洞,會導致Heartbeat預設回傳64KB資料時,造成網站機敏資料外洩。" -- 《ithome》
簡單來說,就是最一般的資料權限與檔案大小處理不當,造成使用Heartbeat服務時lib會將存在記憶體中隨意位址的62KB回傳,又因為沒有權限的檢查,而造成每個人都可以藉由重複利用一直取得server端的記憶體資料。這在一開始學習C語言時就是一直會被強調的問題,因此平時就要檢查code,以避免未來不可預期的損失。
Heartbleed檢測:
https://filippo.io/Heartbleed/
馬上更新openssl版本就可以避免掉這個問題,但目前仍有為數眾多的網站沒有更新,實在是令人擔憂企業對於資安的重視程度!